<?php

// 直接把下面的两个文件封装成一个类的两个成员函数了
// D:\wamp\www\part18\controllers\user\getAvatar.php
// D:\wamp\www\part18\controllers\user\uploadAvatar.php

class Avatar{
    function __construct($conn){
        // 把 $conn 变成了一个成员变量，下面的成员函数就不用传参 $conn 了
        $this->conn = $conn; 
    }

    // 获取头像
    public function getAvatar($uid){
        $avatar = "";
        $resultArray = array("status" => false, "avatar" => "");

        // 根据设置的主键 uid 查：
        // 预处理语句，后面的 ？，也是为了防止黑客的攻击
        // $sql = "SELECT avatar FROM users WHERE uid = ? LIMIT 1"; // LIMIT 1 表示的是下面的查询只查一条数据
        $sql = "SELECT avatar FROM users WHERE uid = ?";
        $mysqli_stmt = $this->conn->prepare($sql);
        
        $mysqli_stmt->bind_param('i', $uid);

        // 执行预处理语句
        if($mysqli_stmt->execute()){
            // bind_result() 绑定结果集中的值到变量
            $mysqli_stmt->bind_result($avatar);
            // 遍历结果集
            while($mysqli_stmt->fetch()){
                // 查到了的话是会赋值到 $avatar 变量里面的哦(没查到的话自然是 "")
                // echo json_encode(array("status" => true, "avatar" => $avatar));
                $resultArray = array("status" => true, "avatar" => $avatar);
                // return $resultArray;
            }
        }else{
            // echo json_encode(array("status" => false, "avatar" => ""));
            $resultArray = array("status" => false, "avatar" => "");
        }

        $mysqli_stmt->free_result();
        $mysqli_stmt->close();
        $this->conn->close();

        return $resultArray;
    }

    // 上传头像
    public function uploadAvatar($uid, $files){
        // 允许上传的图片后缀
        // "text/plain", "image/gif", "image/jpeg", "image/jpg", "image/pjpg", "image/x-png", "image/png"
        $allowedExts = array("txt", "gif", "jpeg", "jpg", "png");
        ini_set('upload_max_filesize', '10M'); // 设置 txt 文件可上传的大小
        $temp = explode(".", $_FILES["file"]["name"]);
        // echo "文件大小: " . $_FILES["file"]["size"] . "<br>"; // debug 文件大小
        $extension = end($temp); // 获取文件后缀名


        if((($_FILES["file"]["type"] == "text/plain")
        || ($_FILES["file"]["type"] == "image/gif")
        || ($_FILES["file"]["type"] == "image/jpeg")
        || ($_FILES["file"]["type"] == "image/jpg")
        || ($_FILES["file"]["type"] == "image/pjpg")
        || ($_FILES["file"]["type"] == "image/x-png")
        || ($_FILES["file"]["type"] == "image/png"))
        && $_FILES["file"]["size"] < 2048000
        && in_array($extension, $allowedExts)){
            if($_FILES["file"]["error"] > 0){
                echo "错误：" . $_FILES["file"]["error"] . "<br>";
                return;
            }else{
                // echo "上传文件名：" . $_FILES["file"]["name"] . "<br>";
                // echo "文件类型：" . $_FILES["file"]["type"] . "<br>";
                // echo "文件大小：" . ($_FILES["file"]["size"] / 1024) . " KB<br>";
                // echo "文件临时存储的位置：" . $_FILES["file"]["tmp_name"] . "<br>";
            }

            // 如果要实现每一个人的头像都是不一样的话，命名文件名的时候就可以使用时间戳了，毕竟时间戳是唯一的(但是我们用户实际的头像长什么样可能是一样的，但时间戳不一样，导致同样的照片因为时间戳不同有多份存在)
            // 所以下面的命名图片使用时间戳是不推荐的
            // $hashValue = $_FILES["file"]["name"] + time();
            // $_FILES["file"]["naame"] = md5($hashValue) . $extension; 

            // 判断 ../../static/img/user/person/ 目录是否存在该文件
            // 如果没有，你需要创建它，权限为 777
            if(file_exists("../../static/img/user/person/" . $_FILES["file"]["name"])){
                echo $_FILES["file"]["name"] . " 文件已经存在。";

                // 虽然文件已经存在，但是还是要更新数据库的 avatar 字段的（数据库的 avatar 字段表示的是当前头像在 server 端的图片路径）
                $avatarPath = "../../static/img/user/person/" . $_FILES["file"]["name"]; // 头像图片的存储路径
                // 更新数据库的代码
                // 注意 php 中调用成员函数之间的调用方式，不然就：Fatal error: Uncaught Error: Call to undefined function updateMysqlAvatar() in D:\wamp\www\part18\controllers\user\avatar.php on line 85
                // updateMysqlAvatar($this->conn, $avatarPath, $uid);
                $this->updateMysqlAvatar($this->conn, $avatarPath, $uid);

                // 不管提交成功与否，都要跳转回去的哦
                // echo "<script>alert('文件已经存在!!!'); window.location.href='../../views/user/person.html?uid={$uid}'</script>";
                
                // 把 {执行成功与否} 和 {头像路径} 用数组都给返回了
                $result = array("status" => true, "avatarPath" => $avatarPath);
                return $result;
            }else{
                move_uploaded_file($_FILES["file"]["tmp_name"], "../../static/img/user/person/" . $_FILES["file"]["name"]);
                // echo "文件存储在：" . "../../static/img/user/person/" . $_FILES["file"]["name"];
                $avatarPath = "../../static/img/user/person/" . $_FILES["file"]["name"]; // 头像图片的存储路径

                // 更新数据库的代码
                $this->updateMysqlAvatar($this->conn, $avatarPath, $uid);
                
                // 不管提交成功与否，都要跳转回去的哦
                // echo "<script>alert('头像图片提交成功!!!'); window.location.href='../../views/user/person.html?uid={$uid}'</script>";
                
                // 把 {执行成功与否} 和 {头像路径} 用数组都给返回了
                $result = array("status" => true, "avatarPath" => $avatarPath);
                return $result;
            }
        }else{
            // echo "非法的文件格式";

            // 非法文件
            // echo "<script>alert('非法文件!!!'); window.location.href='../../views/user/person.html?uid={$uid}'</script>";
            
            // 把 {执行成功与否} 和 {头像路径} 用数组都给返回了
            $result = array("status" => false, "avatarPath" => "");
            return $result;
        }

        // 把 {执行成功与否} 和 {头像路径} 用数组都给返回了
        $result = array("status" => false, "avatarPath" => "");
        return $result;
    }

    // 更新数据库的代码
    private function updateMysqlAvatar($conn, $avatarPath, $uid){
        $sql = "UPDATE users SET avatar = ? WHERE uid = ?";
        $mysqli_stmt = $this->conn->prepare($sql); // 准备预处理语句

        // s: string/date   i: int
        $mysqli_stmt->bind_param('si', $avatarPath, $uid);
        // 执行预处理的语句
        if($mysqli_stmt->execute()){
            // echo $mysqli_stmt->insert_id; // 程序执行成功，返回插入数据表的行 id
            echo PHP_EOL;
        }else{
            echo $mysqli_stmt->error; // 执行失败，展示错误信息
        }
        // 释放结果集
        $mysqli_stmt->free_result();
        $mysqli_stmt->close();
        $this->conn->close();
    }
};